// *** ADDED BY HEADER FIXUP ***
#include <string>
#include <vector>
// *** END ***
#ifndef CMDNU_H
#define CMDNU_H

#include "ComandoRemoverAmigosEnviado.h"
#include "ComandoRemoverAmigosRecebido.h"
#include "ComandoCadastrarMensagem.h"
#include "ComandoCadastrarAmigo.h"
#include "ComandoCadastrarUsuario.h"
#include "ComandoRemoverUsuario.h"
#include "ComandoAtualizarUsuario.h"
#include "ComandoAtualizarAmigo.h"
#include "ComandoLerSenha.h"
#include "ComandoLerClearance.h"
#include "ComandoLerNiver.h"
#include "ComandoLerNome.h"
#include "ComandoLerIdade.h"
#include "ComandoLerMensagemContentChat.h"
#include "ComandoLerMensagemTempoChat.h"
#include "ComandoLerMensagemContentMural.h"
#include "ComandoLerMensagemTempoMural.h"
#include "ComandoLerAmigosPendentes.h"
#include "ComandoLerAmigosConfirmados_v1.h"
#include "ComandoLerAmigosConfirmados_v2.h"
#include "Utilidades.h"
#include "Definicoes.h"
#include "Conta.h"
#include "Amigo.h"
#include <deque>
#include <typeinfo>

//! @brief Classe responsavel por administrar usuarios e seus atributos (mensagens, mural, amigos) em banco de dados.
class ComandosNegociosUser
{
private:
    //! @details Metodo responsavel por criar uma nova conta.
    //! @return Objeto do tipo conta ja construido e validado.
    Conta newConta(const Nome&,const Idade&,const Data&,const Email&,const Senha&,const Clearance&);
    //! @details Metodo responsavel por recuperar o mural de um usuario do banco de dados.
    //! @return Vetor de postagens do mural do usuario.
    vector<Message> retrieveMuralFromBD(const Email&);
    //! @details Metodo responsavel por recuperar mensagens de um usuario do banco de dados.
    //! @return Vetor de mensagens do usuario.
    vector<Message> retrieveChatFromBD(const Email&,const Email&);
    //! @details Metodo responsavel por recuperar a lista de amigos que o usuario adicionou.
    //! @return Vetor de strings com os emails dos amigos do usuario.
    vector<string>  retrieveConfirmados_v1(const Email&,const int&);
    //! @details Metodo responsavel por recuperar a lista de amigos que adicionaram o usuario.
    //! @return Vetor de strings com os emails dos amigos do usuario.
    vector<string>  retrieveConfirmados_v2(const Email&,const int&);
    //! @details Metodo responsavel por recuperar a lista de amigos que adicionaram o usuario e que ele ainda nao confirmou.
    //! @return Vetor de strings com os emails dos amigos pendentes do usuario.
    vector<string>  retrievePendentes(const Email&,const int&);
    //! @details Metodo que armazena uma conta no banco de dados.
    void insertInBD(const Conta&);
    //! @details Metodo que armazena uma mensagem no banco de dados.
    void insertInBD(Message&);
    //! @details Metodo que armazena um amigo no banco de dados.
    void insertInBD(Amigo&);
    //! @details Metodo que remove um usuario do banco de dados.
    void deleteFromBD(const Email&);
    //! @details Metodo que atualiza uma conta no banco de dados.
    void updateInBD(const Conta&);
    //! @details Metodo que atualiza o estado de pendencia de um pedido de amigos no banco de dados.
    void updateInBD(const Email&,const Email&,const string&);
public:
    /*Comandos de admin*/
    //! @details Metodo que acessa a conta do admin.
    //! @return Struct com informacoes da conta do admin.
    RetornoInfo acessarContaBD(const Email& email);
    //! @details Metodo que executa o metodo acessarContaBD(const Email& email).
    //! @return Struct com informacoes da conta do admin.
    RetornoInfo executarMostraConta(const Email&);
    //! @details Construtor vazio da classe.
    ComandosNegociosUser(){};
    void executar(){};
    //! @details Metodo que executa o metodo privado retrieveMuralFromBD(const Email&).
    //! @return Vetor de postagens do mural do usuario.
    vector<Message> executarMural(const Email&);
    //! @details Metodo que executa o metodo privado retrieveChatFromBD(const Email&,const Email&).
    //! @return Vetor de mensagens do usuario.
    vector<Message> executarChat(const Email&,const Email&);
    //! @details Metodo que executa o metodo privado retrievePendentes(const Email&,const int&).
    //! @return Vetor de amigos pendentes do usuario.
    vector<string> executarPendentes(const Email&,const int&);
    //! @details Metodo que executa o metodo privado retrieveConfirmados_v1(const Email&,const int&).
    //! @return Vetor de amigos que o usuario adicionou.
    vector<string> executarConfirmados_v1(const Email&,const int&);
    //! @details Metodo que executa o metodo privado retrieveConfirmados_v2(const Email&,const int&).
    //! @return Vetor de amigos que adicionaram o usuario.
    vector<string> executarConfirmados_v2(const Email&,const int&);
    //! @details Metodo que executa o metodo privado insertInBD(Amigo&).
    void executarCadastroAmigo(Amigo&);
    //! @details Metodo que executa o metodo privado insertInBD(Message&).
    void executarCadastroMensagem(Message&);
    //! @details Metodo que executa o metodo privado updateInBD(const Conta&).
    void executarUpdate(const Nome&,const Idade&,const Data&,const Email&,const Senha&,const Clearance&);
    //! @details Metodo que executa o metodo privado updateInBD(const Email&,const Email&,const string&).
    void executarUpdate(const Email&,const Email&,const string&);
    //! @details Metodo que executa o metodo privado newConta(const Nome&,const Idade&,const Data&,const Email&,const Senha&,const Clearance&).
    void executarRegistro(const Nome&,const Idade&,const Data&,const Email&,const Senha&,const Clearance&);
    //! @details Metodo que executa o metodo privado deleteFromBD(const Email&).
    void executarRemocao(const Email&);
};
#endif
